home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap10 / PopPad2 / PopPad2.c next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  6.6 KB  |  197 lines

  1. /*-----------------------------------------------------
  2.    POPPAD2.C -- Popup Editor Version 2 (includes menu)
  3.                 (c) Charles Petzold, 1998
  4.   -----------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "resource.h"
  8.  
  9. #define ID_EDIT     1
  10.  
  11. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
  12.  
  13. TCHAR szAppName[] = TEXT ("PopPad2") ;
  14.  
  15. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  16.                     PSTR szCmdLine, int iCmdShow)
  17. {
  18.      HACCEL   hAccel ;
  19.      HWND     hwnd ;
  20.      MSG      msg ;
  21.      WNDCLASS wndclass ;
  22.  
  23.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  24.      wndclass.lpfnWndProc   = WndProc ;
  25.      wndclass.cbClsExtra    = 0 ;
  26.      wndclass.cbWndExtra    = 0 ;
  27.      wndclass.hInstance     = hInstance ;
  28.      wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
  29.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  30.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  31.      wndclass.lpszMenuName  = szAppName ;
  32.      wndclass.lpszClassName = szAppName ;
  33.      
  34.      if (!RegisterClass (&wndclass))
  35.      {
  36.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  37.                       szAppName, MB_ICONERROR) ;
  38.           return 0 ;
  39.      }
  40.      
  41.      hwnd = CreateWindow (szAppName, szAppName,
  42.                           WS_OVERLAPPEDWINDOW,
  43.                           GetSystemMetrics (SM_CXSCREEN) / 4,
  44.                           GetSystemMetrics (SM_CYSCREEN) / 4,
  45.                           GetSystemMetrics (SM_CXSCREEN) / 2,
  46.                           GetSystemMetrics (SM_CYSCREEN) / 2,
  47.                           NULL, NULL, hInstance, NULL) ;
  48.      
  49.      ShowWindow (hwnd, iCmdShow) ;
  50.      UpdateWindow (hwnd) ; 
  51.      
  52.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  53.      
  54.      while (GetMessage (&msg, NULL, 0, 0))
  55.      {
  56.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  57.           {
  58.                TranslateMessage (&msg) ;
  59.                DispatchMessage (&msg) ;
  60.           }
  61.      }
  62.      return msg.wParam ;
  63. }
  64.  
  65. AskConfirmation (HWND hwnd)
  66. {
  67.      return MessageBox (hwnd, TEXT ("Really want to close PopPad2?"),
  68.                         szAppName, MB_YESNO | MB_ICONQUESTION) ;
  69. }
  70.  
  71. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  72. {
  73.      static HWND hwndEdit ;
  74.      int         iSelect, iEnable ;
  75.      
  76.      switch (message)
  77.      {
  78.      case WM_CREATE:
  79.           hwndEdit = CreateWindow (TEXT ("edit"), NULL,
  80.                               WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  81.                               WS_BORDER | ES_LEFT | ES_MULTILINE |
  82.                               ES_AUTOHSCROLL | ES_AUTOVSCROLL,
  83.                               0, 0, 0, 0, hwnd, (HMENU) ID_EDIT,
  84.                               ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
  85.           return 0 ;
  86.           
  87.      case WM_SETFOCUS:
  88.           SetFocus (hwndEdit) ;
  89.           return 0 ;
  90.           
  91.      case WM_SIZE: 
  92.           MoveWindow (hwndEdit, 0, 0, LOWORD (lParam), HIWORD (lParam), TRUE) ;
  93.           return 0 ;
  94.           
  95.      case WM_INITMENUPOPUP:
  96.           if (lParam == 1)
  97.           {
  98.                EnableMenuItem ((HMENU) wParam, IDM_EDIT_UNDO,
  99.                     SendMessage (hwndEdit, EM_CANUNDO, 0, 0) ?
  100.                                    MF_ENABLED : MF_GRAYED) ;
  101.                
  102.                EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE,
  103.                     IsClipboardFormatAvailable (CF_TEXT) ?
  104.                                    MF_ENABLED : MF_GRAYED) ;
  105.                
  106.                iSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0) ;
  107.                
  108.                if (HIWORD (iSelect) == LOWORD (iSelect))
  109.                     iEnable = MF_GRAYED ;
  110.                else
  111.                     iEnable = MF_ENABLED ;
  112.                
  113.                EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT,   iEnable) ;
  114.                EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY,  iEnable) ;
  115.                EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR, iEnable) ;
  116.                return 0 ;
  117.           }
  118.           break ;
  119.           
  120.      case WM_COMMAND:
  121.           if (lParam)
  122.           {
  123.                if (LOWORD (lParam) == ID_EDIT &&
  124.                          (HIWORD (wParam) == EN_ERRSPACE ||
  125.                           HIWORD (wParam) == EN_MAXTEXT))
  126.                     MessageBox (hwnd, TEXT ("Edit control out of space."),
  127.                                 szAppName, MB_OK | MB_ICONSTOP) ;
  128.                return 0 ;
  129.           }
  130.           else switch (LOWORD (wParam))
  131.           {
  132.           case IDM_FILE_NEW:
  133.           case IDM_FILE_OPEN:
  134.           case IDM_FILE_SAVE:
  135.           case IDM_FILE_SAVE_AS:
  136.           case IDM_FILE_PRINT:
  137.                MessageBeep (0) ;
  138.                return 0 ;
  139.           
  140.           case IDM_APP_EXIT:
  141.                SendMessage (hwnd, WM_CLOSE, 0, 0) ;
  142.                return 0 ;
  143.  
  144.           case IDM_EDIT_UNDO:
  145.                SendMessage (hwndEdit, WM_UNDO, 0, 0) ;
  146.                return 0 ;
  147.           
  148.           case IDM_EDIT_CUT:
  149.                SendMessage (hwndEdit, WM_CUT, 0, 0) ;
  150.                return 0 ;
  151.           
  152.           case IDM_EDIT_COPY:
  153.                SendMessage (hwndEdit, WM_COPY, 0, 0) ;
  154.                return 0 ;
  155.           
  156.           case IDM_EDIT_PASTE:
  157.                SendMessage (hwndEdit, WM_PASTE, 0, 0) ;
  158.                return 0 ;
  159.           
  160.           case IDM_EDIT_CLEAR:
  161.                SendMessage (hwndEdit, WM_CLEAR, 0, 0) ;
  162.                return 0 ;
  163.           
  164.           case IDM_EDIT_SELECT_ALL:
  165.                SendMessage (hwndEdit, EM_SETSEL, 0, -1) ;
  166.                return 0 ;
  167.           
  168.           case IDM_HELP_HELP:
  169.                MessageBox (hwnd, TEXT ("Help not yet implemented!"),
  170.                            szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  171.                return 0 ;
  172.           
  173.           case IDM_APP_ABOUT:
  174.                MessageBox (hwnd, TEXT ("POPPAD2 (c) Charles Petzold, 1998"),
  175.                            szAppName, MB_OK | MB_ICONINFORMATION) ;
  176.                return 0 ;
  177.           }
  178.           break ;
  179.           
  180.      case WM_CLOSE:
  181.           if (IDYES == AskConfirmation (hwnd))
  182.                DestroyWindow (hwnd) ;
  183.           return 0 ;
  184.           
  185.      case WM_QUERYENDSESSION:
  186.           if (IDYES == AskConfirmation (hwnd))
  187.                return 1 ;
  188.           else
  189.                return 0 ;
  190.           
  191.      case WM_DESTROY:
  192.           PostQuitMessage (0) ;
  193.           return 0 ;
  194.      }
  195.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  196. }
  197.